package com.siashan.unipay4j.wx.pay;

import com.siashan.unipay4j.core.IPayConfig;
import com.siashan.unipay4j.core.exception.Unipay4jOperationNotSupportedException;
import com.siashan.unipay4j.core.pay.PayModel;
import com.siashan.unipay4j.core.Result;
import com.siashan.unipay4j.wx.model.UnifiedOrderModel;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 微信付款码支付
 * 收银员使用扫码设备读取微信用户付款码以后，二维码或条码信息会传送至商户收银台，由商户收银台或者商户后台调用该接口发起支付。
 *
 * 提醒1：提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时，商户系统等待5秒后调用【查询订单API】，
 * 查询支付实际交易结果；当返回结果为“USERPAYING”时，商户系统可设置间隔时间(建议10秒)重新查询支付结果，直到支付成功或超时(建议30秒)；
 *
 * 提醒2：在调用查询接口返回后，如果交易状况不明晰，请调用【撤销订单API】，此时如果交易失败则关闭订单，该单不能再支付成功；
 * 如果交易成功，则将扣款退回到用户账户。当撤销无返回或错误时，请再次调用。注意：请勿扣款后立即调用【撤销订单API】,建议至少15秒后再调用。撤销订单API需要双向证书。
 *
 * @author  siashan
 * @since  v1.0.1
 **/
@Slf4j
public class WxPayMICRO extends WxPay {

    public WxPayMICRO() {
        super();
    }

    public WxPayMICRO(IPayConfig payConfig) {
        super(payConfig);
    }

    @Override
    public String loadV3PayUrl() {
        throw new Unipay4jOperationNotSupportedException("V3接口暂不支持付款码支付接口，请使用V2接口");
    }

    /**
     * 支付
     *
     * @param model 支付请求参数
     * @return 支付结果
     */
    @Override
    public Result pay(PayModel model) {
        return doPay(model, WxTradeTypeEnum.MICROPAY);
    }


    /**
     * 是否需要openId参数
     *
     * @return 是否需要
     */
    @Override
    public boolean needOpenId() {
        return false;
    }

    /**
     * 处理交易成功逻辑
     *
     * @param r  报文
     * @return 返回结果
     * @throws Exception
     */
    @Override
    public Result doTradeSuccess(Map<String, String> r) throws Exception {
        Map<String, String> map = new HashMap<>(8);
        return Result.tradeSuccess(map);
    }

    /**
     * 处理交易成功逻辑
     *
     * @param body  报文
     * @param orderModel 下单参数
     * @return 返回结果
     */
    @Override
    public Result doTradeSuccessV3(String body, UnifiedOrderModel orderModel) {
        return null;
    }
}
